日期差值
题目 日期差值
思路分析
可以直接按之前的思路 从一段长度里面找合法日期数量 累加一下就是相差的天数
但是对于这里来说 时间效率太低了 会超时
#include<bits/stdc++.h>
using namespace std;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int Start,End;
bool check_date(int year,int month,int day)
{
if(month==0 || month>12)
return false;
if(day==0 || day>31)
return false;
int curdays=days[month];
if(month==2)
if(year%100 && year%4==0 || year%400==0)
curdays++;
if(day>curdays)
return false;
return true;
}
int main()
{
while(cin>>Start>>End){
if(Start>End)
swap(Start,End);
int cnt=0;
for(int date=Start;date<=End;date++){
int year=date/10000,month=date%10000/100,day=date%100;
if(check_date(year,month,day)){
cnt++;
}
}
cout<<cnt<<endl;
}
return 0;
}
类似于前缀和
通过计算两个日期分别距离一个固定日期(例如公元1年1月1日)的总天数,然后计算这两个天数之间的差值来得到日期差
此外,还需要考虑闰年对2月天数的影响
代码实现
#include<bits/stdc++.h>
using namespace std;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算从公元1年1月1日到指定日期的总天数
int daysFromStart(int year, int month, int day) {
int totalDays = 0;
// 添加之前年份的天数
for(int y = 1; y < year; y++) {
totalDays += isLeapYear(y) ? 366 : 365;
}
// 添加当前年份的月份天数
for(int m = 1; m < month; m++) {
totalDays += days[m];
if(m == 2 && isLeapYear(year)) {
totalDays++;
}
}
// 添加当前月份的天数
totalDays += day;
return totalDays;
}
int main() {
int startDate, endDate;
while(cin >> startDate >> endDate) {
if(startDate>endDate)
swap(startDate,endDate);
int startYear=startDate/10000,startMonth=startDate%10000/100,startDay=startDate%100;
int endYear=endDate/10000,endMonth=endDate%10000/100,endDay=endDate%100;
int dateDiff=daysFromStart(endYear,endMonth,endDay) - daysFromStart(startYear,startMonth,startDay) + 1;
cout << dateDiff << endl;
}
return 0;
}
//读入可以写成
/*
while (~scanf("%04d%02d%02d\n%04d%02d%02d", &y1, &m1, &d1, &y2, &m2, &d2))
printf("%d\n", abs(daysFromStart(y1, m1, d1) - daysFromStart(y2, m2, d2)) + 1);
*/
💬 评论